package edu.client;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.datepicker.client.DateBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.OrdenFabricacionGeneralDTO;
import edu.shared.DTO.OrdenPedidoDTO;
import edu.shared.DTO.RenglonOrdenFabricacionGeneralDTO;
import edu.shared.DTO.RenglonOrdenPedidoDTO;

public class P_CrearOrdenFabricacion extends Composite{
	
	//columnas de la tabla de equipos
	private static final int COL_CODIGO = 0;
	private static final int COL_EQUIPO_COMPONENTE = 1;
	private static final int COL_DISPONIBLE = 2;
	private static final int COL_CANTIDAD_REQUERIDA = 3;
	private static final int COL_CANTIDAD_PRODUCIR = 4;
	private static final int COL_ESTADO_LISTA_MATERIALES = 5;
	private static final int COL_FECHA_ESTIMADA_INICIO = 6;
	private static final int COL_FECHA_ESTIMADA_FINALIZACION = 7;
	
	private FlexTable ftEquipos;
	private TextArea taObservaciones;
	
	private OrdenPedidoDTO orden;
	private List<RenglonOrdenPedidoDTO> renglones;
	
	private TabPanel tpPadre;
	private String usuario;
	private IngenieriaServiceAsync ingenieriaService;
	
	private Button btnCrearOrdenFabricacion;
	private Button btnGuardar;
	
	public P_CrearOrdenFabricacion(TabPanel padre, OrdenPedidoDTO ordenDePedido, String usuarioLogueado)
	{
		this.tpPadre = padre;
		this.usuario = usuarioLogueado;
		this.orden = ordenDePedido;
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		//se utiliza para formatear fechas
		DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "732px");
		
		Label lblDetalleOrdenPedido = new Label("DETALLE DE LA ORDEN DE PEDIDO");
		lblDetalleOrdenPedido.setStyleName("labelTitulo");
		layoutPanel.add(lblDetalleOrdenPedido);
		layoutPanel.setWidgetLeftWidth(lblDetalleOrdenPedido, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblDetalleOrdenPedido, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label nroOrdenPedidoLabel = new Label("Nº ORDEN DE PEDIDO:");
		nroOrdenPedidoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nroOrdenPedidoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nroOrdenPedidoLabel);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox nroOrdenPedidoTB = new TextBox();
		layoutPanel.add(nroOrdenPedidoTB);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoTB, 65.0, Unit.PX, 32.0, Unit.PX);
		nroOrdenPedidoTB.setText(String.valueOf(orden.getNroOrden()));
		nroOrdenPedidoTB.setEnabled(false);
		
		Label fechaGeneracionLabel = new Label("FECHA DE GENERACION:");
		fechaGeneracionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaGeneracionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaGeneracionLabel);
		layoutPanel.setWidgetLeftWidth(fechaGeneracionLabel, /*47.0*/52.0, Unit.PCT, 17.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaGeneracionLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox fechaGeneracionTB = new TextBox();
		layoutPanel.add(fechaGeneracionTB);
		layoutPanel.setWidgetLeftWidth(fechaGeneracionTB, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaGeneracionTB, 65.0, Unit.PX, 32.0, Unit.PX);
		fechaGeneracionTB.setText(formatoFecha.format(orden.getFechaGeneracion()));
		fechaGeneracionTB.setEnabled(false);
		
		Label clienteLabel = new Label("CLIENTE:");
		clienteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		clienteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(clienteLabel);
		layoutPanel.setWidgetLeftWidth(clienteLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox clienteTB = new TextBox();
		layoutPanel.add(clienteTB);
		layoutPanel.setWidgetLeftWidth(clienteTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteTB, 100.0, Unit.PX, 32.0, Unit.PX);
		clienteTB.setText(orden.getNombreCliente().toUpperCase());
		clienteTB.setEnabled(false);
		
		//Este campo también es llamado Fecha límite de finalización.
		Label fechaPrevistaEntregaLabel = new Label("FECHA PREVISTA DE ENTREGA:");
		fechaPrevistaEntregaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaPrevistaEntregaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaPrevistaEntregaLabel);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaEntregaLabel, /*47.0*/52.0, Unit.PCT, 17.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaEntregaLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		TextBox fechaPrevistaEntregaDB = new TextBox();
		layoutPanel.add(fechaPrevistaEntregaDB);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaEntregaDB, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaEntregaDB, 100.0, Unit.PX, 32.0, Unit.PX);
		if(orden.getFechaPrevistaEntrega() != null)
			fechaPrevistaEntregaDB.setText(formatoFecha.format(orden.getFechaPrevistaEntrega()));
		fechaPrevistaEntregaDB.setEnabled(false);
		
		Label observacionLabel = new Label("OBSERVACIÓN:");
		observacionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		observacionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(observacionLabel);
		layoutPanel.setWidgetLeftWidth(observacionLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionLabel, 148.0, Unit.PX, 19.0, Unit.PX);
		
		TextArea observacionTA = new TextArea();
		layoutPanel.add(observacionTA);
		layoutPanel.setWidgetLeftWidth(observacionTA, 17.5, Unit.PCT, /*67.5*/77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionTA, 135.0, Unit.PX, 47.0, Unit.PX);
		if(orden.getObservacion() != null)
			observacionTA.setText(orden.getObservacion());
		observacionTA.setEnabled(false);
		
		Label lblEquiposSolicitados = new Label("EQUIPOS Y COMPONENTES SOLICITADOS");
		lblEquiposSolicitados.setStyleName("labelTitulo");
		layoutPanel.add(lblEquiposSolicitados);
		layoutPanel.setWidgetLeftWidth(lblEquiposSolicitados, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblEquiposSolicitados, 210.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblObersacionesOrdenFabricacion = new Label("OBSERVACIONES:");
		lblObersacionesOrdenFabricacion.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblObersacionesOrdenFabricacion);
		layoutPanel.setWidgetLeftWidth(lblObersacionesOrdenFabricacion, 5.0, Unit.PCT, 143.5, Unit.PX);
		layoutPanel.setWidgetTopHeight(lblObersacionesOrdenFabricacion, 290.0, Unit.PX, 19.0, Unit.PX);
		
		taObservaciones = new TextArea();
		layoutPanel.add(taObservaciones);
		layoutPanel.setWidgetLeftWidth(taObservaciones, 17.5, Unit.PCT, 77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(taObservaciones, 276.0, Unit.PX, 47.0, Unit.PX);
		
		ScrollPanel spEquipos = new ScrollPanel();
		spEquipos.setStyleName("tabla");
		layoutPanel.add(spEquipos);
		layoutPanel.setWidgetLeftWidth(spEquipos, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spEquipos, 340.0, Unit.PX, 250.0, Unit.PX);
		
		ftEquipos = new FlexTable();
		spEquipos.setWidget(ftEquipos);
		ftEquipos.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna código de equipo		
		ftEquipos.setText(0, COL_CODIGO, "CODIGO");
		ftEquipos.getCellFormatter().setWidth(0, COL_CODIGO, "15%");
		
		// columna nombre para el cliente
		ftEquipos.setText(0, COL_EQUIPO_COMPONENTE, "EQUIPO / COMPONENTE");
		ftEquipos.getCellFormatter().setWidth(0, COL_EQUIPO_COMPONENTE, "25%");
		
		// columna disponible en almacén
		ftEquipos.setText(0, COL_DISPONIBLE, "DISPONIBLE");
		ftEquipos.getCellFormatter().setWidth(0, COL_DISPONIBLE, "10%");
		
		// columna cantidad requerida
		ftEquipos.setText(0, COL_CANTIDAD_REQUERIDA, "CANTIDAD REQUERIDA");
		ftEquipos.getCellFormatter().setWidth(0, COL_CANTIDAD_REQUERIDA, "10%");
		
		// columna cantidad a producir
		ftEquipos.setText(0, COL_CANTIDAD_PRODUCIR, "CANTIDAD A PRODUCIR");
		ftEquipos.getCellFormatter().setWidth(0, COL_CANTIDAD_PRODUCIR, "10%");
		
		// columna estado lista de materiales
		ftEquipos.setText(0, COL_ESTADO_LISTA_MATERIALES, "ESTADO LISTA DE MATERIALES");
		ftEquipos.getCellFormatter().setWidth(0, COL_ESTADO_LISTA_MATERIALES, "10%");
		
		// columna fecha estimada inicio
		ftEquipos.setText(0, COL_FECHA_ESTIMADA_INICIO, "FECHA ESTIMADA INICIO");
		ftEquipos.getCellFormatter().setWidth(0, COL_FECHA_ESTIMADA_INICIO, "10%");
		
		// columna fecha estimada finalización
		ftEquipos.setText(0, COL_FECHA_ESTIMADA_FINALIZACION, "FECHA ESTIMADA FINALIZACIÓN");
		ftEquipos.getCellFormatter().setWidth(0, COL_FECHA_ESTIMADA_FINALIZACION, "10%");
				
		// seteamos el estilo a los encabezados
		ftEquipos.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 590.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnCancelar = new Button("");
		btnCancelar.setText("CANCELAR");
		
		//al presionar el botón cancelar
		btnCancelar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar();
			}
		});
		
		layoutPanel.add(btnCancelar);
		layoutPanel.setWidgetRightWidth(btnCancelar, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnCancelar, 32.0, Unit.PX, 28.0, Unit.PX);
		
		btnCrearOrdenFabricacion = new Button("GENERAR");
		
		//al presionar el botón crear orden de fabricación
		btnCrearOrdenFabricacion.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				btnCrearOrdenFabricacion.setEnabled(false);
				//llamamos al método que valida los datos cargados y le pasamos como parámetro el estado con el que se
				//creará la orden de fabricación en caso de que no se produzcan errores
				validarDatos("CREAR");
			}
		});

		layoutPanel.add(btnCrearOrdenFabricacion);
		layoutPanel.setWidgetRightWidth(btnCrearOrdenFabricacion, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnCrearOrdenFabricacion, 32.0, Unit.PX, 28.0, Unit.PX);
		
		btnGuardar = new Button("GUARDAR");
		
		//al presionar el botón guardar
		btnGuardar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				btnGuardar.setEnabled(false);
				
				//llamamos al método que valida los datos cargados y le pasamos como parámetro el estado con el que se
				//creará la orden de fabricación en caso de que no se produzcan errores
				validarDatos("GUARDAR");
			}
		});
		
		layoutPanel.add(btnGuardar);
		layoutPanel.setWidgetRightWidth(btnGuardar, 30.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnGuardar, 32.0, Unit.PX, 28.0, Unit.PX);
		
		cargarEquipos();
	}
	
	private void cargarEquipos()
	{
		int numeroOrden = (int)orden.getNroOrden();
		
		ingenieriaService.buscarRenglonesOrdenPedido(numeroOrden, new AsyncCallback<List<RenglonOrdenPedidoDTO>>()
		{

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
				
			}

			@Override
			public void onSuccess(List<RenglonOrdenPedidoDTO> result) {
				renglones = result;
				
				int numeroFila = 1;
				
				for(RenglonOrdenPedidoDTO renglon : renglones)
				{
					
					//columna código de equipo
					ftEquipos.setWidget(numeroFila, COL_CODIGO, new Label(renglon.getCodigo()));
					ftEquipos.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_CODIGO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//columna nombre para el cliente
					ftEquipos.setWidget(numeroFila, COL_EQUIPO_COMPONENTE, new Label(renglon.getEquipoOComponente()));
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_EQUIPO_COMPONENTE, true);
					
					//columna disponible en almacén
					ftEquipos.setWidget(numeroFila, COL_DISPONIBLE, new Label(String.valueOf(renglon.getCantidadDisponible())));
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_DISPONIBLE, true);
									
					// columna cantidad requerida
					ftEquipos.setWidget(numeroFila, COL_CANTIDAD_REQUERIDA, new Label(String.valueOf(renglon.getCantidad())));
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_CANTIDAD_REQUERIDA, true);
										
					TextBox cantidadAProducir = new TextBox();			
					cantidadAProducir.setSize("85%", "85%");
					cantidadAProducir.setStyleName("textBoxTabla");
					
					// columna cantidad a producir
					ftEquipos.setWidget(numeroFila, COL_CANTIDAD_PRODUCIR, cantidadAProducir);
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_CANTIDAD_PRODUCIR, true);
			
					//columna estado lista de materiales
					ftEquipos.setWidget(numeroFila, COL_ESTADO_LISTA_MATERIALES, new Label(renglon.getEstadoListaMateriales()));
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_ESTADO_LISTA_MATERIALES, true);
					
					DateBox fechaInicio = new DateBox();
					fechaInicio.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
					fechaInicio.getTextBox().setReadOnly(true);
					fechaInicio.setSize("85%", "85%");
					fechaInicio.setStyleName("textBoxTabla");
					
					//columna fecha estimada inicio
					ftEquipos.setWidget(numeroFila, COL_FECHA_ESTIMADA_INICIO, fechaInicio);
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_ESTIMADA_INICIO, true);
					
					DateBox fechaFinalizacion = new DateBox();
					fechaFinalizacion.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
					fechaFinalizacion.getTextBox().setReadOnly(true);
					fechaFinalizacion.setSize("85%", "85%");
					fechaFinalizacion.setStyleName("textBoxTabla");
					
					//columna fecha estimada finalización
					ftEquipos.setWidget(numeroFila, COL_FECHA_ESTIMADA_FINALIZACION, fechaFinalizacion);
					ftEquipos.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_ESTIMADA_FINALIZACION, true);
										
					//seteamos el estilo de renglón de tabla
					ftEquipos.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
					
					numeroFila++;
				}
				
			}
	
		});		
	}
	
	
	/**
	 * Método que valida los datos cargados para la creación de la orden de fabricación
	 * @param estado. Es el estado en el que se registrará la orden de fabricación en caso de que no haya errores.
	 */
	private void validarDatos(String accion)
	{
		try
		{
			//recorremos la tabla de equipos		
			for(int i=1; i < ftEquipos.getRowCount(); i++) {
			
				String nombreParaCliente = ((Label) ftEquipos.getWidget(i, COL_EQUIPO_COMPONENTE)).getText();
				
				Label lblCantidadRequerida = (Label) ftEquipos.getWidget(i, COL_CANTIDAD_REQUERIDA);
				TextBox lblCantidadProducir = (TextBox) ftEquipos.getWidget(i, COL_CANTIDAD_PRODUCIR);
				DateBox dbfechaInicio = (DateBox) ftEquipos.getWidget(i, COL_FECHA_ESTIMADA_INICIO);
				DateBox dbfechaFinalizacion = (DateBox) ftEquipos.getWidget(i, COL_FECHA_ESTIMADA_FINALIZACION);
				
				int cantidadRequerida = Integer.parseInt(lblCantidadRequerida.getText());				
				int cantidadProducir = Integer.parseInt(lblCantidadProducir.getText());
				Date fechaInicio = dbfechaInicio.getValue();
				Date fechaFinalizacion = dbfechaFinalizacion.getValue();
				
				//verificamos que la cantidad a producir sea mayor o igual que la cantidad requerida
				if(cantidadProducir < cantidadRequerida)
					throw new Exception("Fila " + nombreParaCliente + ": la cantidad a producir no puede ser menor a la cantidad requerida.");
				
				if(fechaInicio == null)
					throw new Exception("Fila " + nombreParaCliente + ": la fecha de inicio no puede ser vacía.");
				
				if(fechaFinalizacion == null)
					throw new Exception("Fila " + nombreParaCliente + ": la fecha de finalización no puede ser vacía");
				
				if(fechaInicio.after(fechaFinalizacion))
					throw new Exception("Fila " + nombreParaCliente + ": la fecha de inicio no puede ser mayor a la de finalización.");
			}
			
			//llamamos al método que crea la orden de fabricación con el estado que se pasó como parámetro
			registrarOrdenFabricacion(accion);
		}		
		
		catch(NumberFormatException nfe)
		{
			Window.alert("La cantidad a producir debe ser un número entero no vacío.");			
			btnCrearOrdenFabricacion.setEnabled(true);
			btnGuardar.setEnabled(true);

		}
		
		catch(Exception e)
		{
			Window.alert(e.getMessage());
			btnCrearOrdenFabricacion.setEnabled(true);
			btnGuardar.setEnabled(true);
		}
	}
	
	
	private void registrarOrdenFabricacion(String accion)
	{
		//calculamos la fecha prevista de inicio y finalizaón de la orden de fabricación. 
		//Estas serán, respectivamente, la fecha prevista de inicio más baja y la fecha de finalización más alta cargadas para
		//la fabricación de equipos/componentes
		Date fechaPrevistaInicio = ((DateBox) ftEquipos.getWidget(1, COL_FECHA_ESTIMADA_INICIO)).getValue();
		Date fechaPrevistaFinalizacion = ((DateBox) ftEquipos.getWidget(1, COL_FECHA_ESTIMADA_FINALIZACION)).getValue();
		
		//recorremos la tabla de equipos y buscamos la fecha de inicio más baja y la fecha de finalización más alta		
		for(int i=2; i < ftEquipos.getRowCount(); i++) {

			Date fechaInicio = ((DateBox) ftEquipos.getWidget(i, COL_FECHA_ESTIMADA_INICIO)).getValue();
			Date fechaFinalizacion = ((DateBox) ftEquipos.getWidget(i, COL_FECHA_ESTIMADA_FINALIZACION)).getValue();
			
			if(fechaInicio.before(fechaPrevistaInicio))
				fechaPrevistaInicio = fechaInicio;
			
			if(fechaFinalizacion.after(fechaPrevistaFinalizacion))
				fechaPrevistaFinalizacion = fechaFinalizacion;
		}
		
		//calculamos el estado de la orden de fabricación general
		String estado;
		
		//si se presionó el botón guardar, seteamos a la orden el estado guardada
		if(accion.equals("GUARDAR"))
			estado = "GUARDADA";
		
		//si se presionó el botón crear, buscamos los estados de las listas de materiales de los equipos/componentes que conforman
		//la orden de fabricación general. Si todas las listas de materiales están en estado generada el estado de la orden de fabricación
		//será generdad, caso contrario será provisoria.
		else
		{
			estado = "GENERADA";
			
			int i = 0;
			boolean existeEstadoProvisorio = false;
			
			while(i < renglones.size() && !existeEstadoProvisorio)
			{
				if(renglones.get(i).getEstadoListaMateriales().equals("PROVISORIA"))
				{
					estado = "PROVISORIA";
					existeEstadoProvisorio = true;
				}
				
				i++;
			}
		}
		
		//cargamos los renglones de la orden de fabricación general
		Set<RenglonOrdenFabricacionGeneralDTO> renglonesOrdenFabricacion = new HashSet<RenglonOrdenFabricacionGeneralDTO>();
		
		for(int i=0; i<renglones.size(); i++)
		{
			RenglonOrdenFabricacionGeneralDTO renglonOrdenFabricacion = new RenglonOrdenFabricacionGeneralDTO();
			
			//obtenemos los valores cargados en la fila de la tabla
			int cantidadAProducir = Integer.parseInt(((TextBox) ftEquipos.getWidget(i+1, COL_CANTIDAD_PRODUCIR)).getText());			
			Date fechaInicio = ((DateBox) ftEquipos.getWidget(i+1, COL_FECHA_ESTIMADA_INICIO)).getValue();
			Date fechaFinalizacion = ((DateBox) ftEquipos.getWidget(i+1, COL_FECHA_ESTIMADA_FINALIZACION)).getValue();
			
			//seteamos los datos al renglón de la orden de fabricación
			renglonOrdenFabricacion.setRenglonOrdenPedidoDTO(renglones.get(i));
			renglonOrdenFabricacion.setCantidadAProducir(cantidadAProducir);
			renglonOrdenFabricacion.setFechaEstimadaInicio(fechaInicio);
			renglonOrdenFabricacion.setFechaEstimadaFinalizacion(fechaFinalizacion);
			
			renglonesOrdenFabricacion.add(renglonOrdenFabricacion);
		}
		
		//cargamos los datos de la orden de fabricación
		OrdenFabricacionGeneralDTO ordenFabricacionDTO = new OrdenFabricacionGeneralDTO();
		
		ordenFabricacionDTO.setOrdenPedidoDTO(orden);
		ordenFabricacionDTO.setResponsable(usuario);
		ordenFabricacionDTO.setFechaGeneracion(new Date());
		ordenFabricacionDTO.setFechaCierre(null);       
		ordenFabricacionDTO.setFechaPrevistaInicio(fechaPrevistaInicio);  
		ordenFabricacionDTO.setFechaPrevistaFinalizacion(fechaPrevistaFinalizacion);
		ordenFabricacionDTO.setEstado(estado);
		ordenFabricacionDTO.setObservaciones(taObservaciones.getText());
		ordenFabricacionDTO.setRenglonOrdenFabricacionGeneralsDTO(renglonesOrdenFabricacion);
		
		ingenieriaService.registrarOrdenFabricacion(ordenFabricacionDTO, new AsyncCallback<Boolean>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
				btnCrearOrdenFabricacion.setEnabled(true);
				btnGuardar.setEnabled(true);
			}
	
			@Override
			public void onSuccess(Boolean result) {
				Window.alert("La orden de fabricación general ha sido procesada correctamente.");
				
				//cerramos la pantalla
				tpPadre.remove(Validaciones.numeroElemento(tpPadre, "CREAR ORDEN FABRICACIÓN"));
			}});
	}
	
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 */
	 private void cancelar() {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_CrearOrdenFabricacionSeleccion p_crearOrdenFabricacionSeleccion = new P_CrearOrdenFabricacionSeleccion(tpPadre, usuario);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle("CREAR ORDEN FABRICACIÓN");
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(p_crearOrdenFabricacionSeleccion);
		tpPadre.add(formulario, "CREAR ORDEN FABRICACIÓN", false);
		tpPadre.selectTab(Validaciones.numeroElemento(tpPadre, "CREAR ORDEN FABRICACIÓN"));
		
		tpPadre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < tpPadre.getWidgetCount(); i++) {
			tpPadre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	 }
}
